package Model;

import DAO.DAOConserto;
import Util.Util;
import static Util.Util.DataNula;
import static Util.Util.DataMaxima;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;

/**
 *
 * @author ebastos
 */
public class BeanConserto {

    private int ID;
    private int PRODUTOID;
    private int MATRICULA;
    private long CLIENTECPF;
    private Date dataEntrada;
    private Date dataPrevSaida;
    private Date dataRetirada;
    private float valor;
    private String descricaoProbCliente;
    private String descricaoSolucao;
    private Date dataConserto;
    private Date dataExclusao;
    private BeanProduto produto;
    private BeanFuncionario funcionario;
    private BeanPessoa cliente;

    public BeanConserto() {
    }

    public BeanConserto(int ID) throws SQLException {
        DAOConserto bancoConserto = new DAOConserto();
        BeanConserto conserto = bancoConserto.RetornaConserto(ID);
        this.ID = ID;
        this.PRODUTOID = conserto.getPRODUTOID();
        this.MATRICULA = conserto.getMATRICULA();
        this.CLIENTECPF = conserto.getCLIENTECPF();
        this.dataEntrada = conserto.getDataEntrada();
        this.dataPrevSaida = conserto.getDataPrevSaida();
        this.dataRetirada = conserto.getDataRetirada();
        this.valor = conserto.getValor();
        this.descricaoProbCliente = conserto.getDescricaoProbCliente();
        this.descricaoSolucao = conserto.getDescricaoSolucao();
        this.dataConserto = conserto.getDataConserto();
        this.dataExclusao = conserto.getDataExclusao();
    }

    public ArrayList<BeanConserto> ListaConsertos() throws SQLException {
        DAOConserto bancoConserto = new DAOConserto();
        return bancoConserto.RetornaConsertos();
    }

    public ArrayList<BeanConserto> ListaConsertos(Date dtIniAbertura, Date dtFimAbertura, String produto, String cliente, boolean atrasado, boolean aberto, boolean fechado, boolean excluido, boolean consertado) throws Exception {
        if (dtIniAbertura.after(dtFimAbertura)) {
            throw new Exception("A data inicial deve ser menor qua data final do filtro.");
        }
        if ((atrasado || aberto) && fechado) {
            throw new Exception("É impossível haver um pedido que esteja aberto ou atrasado e ao mesmo tempo fechado, favor rever seus filtros.");
        }
        DAOConserto bancoConserto = new DAOConserto();
        return bancoConserto.RetornaConsertos(dtIniAbertura, dtFimAbertura, produto, cliente, atrasado, aberto, fechado, excluido, consertado);
    }

    public ArrayList<BeanConserto> ListaConsertos(Date dtIniAbertura, Date dtFimAbertura, boolean atrasado, boolean aberto, boolean fechado, boolean excluido, boolean consertado) throws SQLException {
        DAOConserto bancoConserto = new DAOConserto();
        return bancoConserto.RetornaConsertos(dtIniAbertura, dtFimAbertura, "", "", atrasado, aberto, fechado, excluido, consertado);
    }

    public ArrayList<BeanConserto> ListaConsertos(boolean atrasado, boolean aberto, boolean fechado, boolean excluido, boolean consertado) throws SQLException {
        DAOConserto bancoConserto = new DAOConserto();
        return bancoConserto.RetornaConsertos(DataNula, DataMaxima, "", "", atrasado, aberto, fechado, excluido, consertado);
    }

    public void Salvar(int ID, int produto, int funcionario, long cliente, Date dataEntrada, Date dataPrevSaida, float valor, String problema) throws Exception {
        BeanConserto conserto = new BeanConserto();
        
        if (dataEntrada.after(dataPrevSaida))
            throw new Exception("Data abertura deve ser menor que data de previsão de saída.");
        
        conserto.setID(ID);
        conserto.setPRODUTOID(produto);
        conserto.setMATRICULA(funcionario);
        conserto.setCLIENTECPF(cliente);
        conserto.setDataEntrada(dataEntrada);
        conserto.setDataPrevSaida(dataPrevSaida);
        conserto.setValor(valor);
        conserto.setDescricaoProbCliente(problema);

        DAOConserto banco = new DAOConserto();
        if (ID == 0) {
            banco.Inserir(conserto);
        } else {
            banco.Atualizar(conserto);
        }
    }
    
    public void Consertar(int ID, Date dataConserto, String solucao) throws Exception {
        BeanConserto conserto = new BeanConserto(ID);
        
        if (solucao == null || solucao.trim().isEmpty())
            throw new Exception("É obrigatório informar uma solução.");
        
        conserto.setDataConserto(dataConserto);
        conserto.setDescricaoSolucao(solucao);
        
        DAOConserto banco = new DAOConserto();
        banco.Consertar(conserto);
    }
    
    public void Fechar(int ID) throws SQLException {
        DAOConserto banco = new DAOConserto();
        banco.Fechar(ID);
    }
    
    public void Remover(int ID) throws SQLException {
        DAOConserto banco = new DAOConserto();
        banco.Remover(ID);
    }

    public int getID() {
        return ID;
    }

    public void setID(int ID) {
        this.ID = ID;
    }

    public int getPRODUTOID() {
        return PRODUTOID;
    }

    public void setPRODUTOID(int PRODUTOID) {
        this.PRODUTOID = PRODUTOID;
    }

    public int getMATRICULA() {
        return MATRICULA;
    }

    public void setMATRICULA(int MATRICULA) {
        this.MATRICULA = MATRICULA;
    }

    public long getCLIENTECPF() {
        return CLIENTECPF;
    }

    public void setCLIENTECPF(long CLIENTECPF) {
        this.CLIENTECPF = CLIENTECPF;
    }

    public Date getDataEntrada() {
        return dataEntrada;
    }

    public void setDataEntrada(Date dataEntrada) {
        this.dataEntrada = dataEntrada;
    }

    public Date getDataPrevSaida() {
        return dataPrevSaida;
    }

    public void setDataPrevSaida(Date dataPrevSaida) {
        this.dataPrevSaida = dataPrevSaida;
    }

    public Date getDataRetirada() {
        return dataRetirada;
    }

    public void setDataRetirada(Date dataRetirada) {
        this.dataRetirada = dataRetirada;
    }

    public float getValor() {
        return valor;
    }

    public String getValorFormatado() {
        return String.format("%.2f", this.valor);
    }

    public void setValor(float valor) {
        this.valor = valor;
    }

    public String getDescricaoProbCliente() {
        return descricaoProbCliente;
    }

    public void setDescricaoProbCliente(String descricaoProbCliente) {
        this.descricaoProbCliente = descricaoProbCliente;
    }

    public String getDescricaoSolucao() {
        return descricaoSolucao;
    }

    public void setDescricaoSolucao(String descricaoSolucao) {
        this.descricaoSolucao = descricaoSolucao;
    }

    public Date getDataConserto() {
        return dataConserto;
    }

    public void setDataConserto(Date dataConserto) {
        this.dataConserto = dataConserto;
    }
    
    public Date getDataExclusao() {
        return dataExclusao;
    }

    public void setDataExclusao(Date dataExclusao) {
        this.dataExclusao = dataExclusao;
    }

    public BeanProduto getProduto() {
        if (this.produto == null) {
            this.produto = new BeanProduto(this.PRODUTOID);
        }
        return this.produto;
    }

    public void setProduto(BeanProduto produto) {
        this.PRODUTOID = produto.getID();
        this.produto = produto;
    }

    public BeanFuncionario getFuncionario() {
        if (this.funcionario == null) {
            this.funcionario = new BeanFuncionario(this.MATRICULA);
        }
        return this.funcionario;
    }

    public void setFuncionario(BeanFuncionario funcionario) {
        this.MATRICULA = funcionario.getMATRICULA();
        this.funcionario = funcionario;
    }

    public BeanPessoa getCliente() {
        if (this.cliente == null) {
            this.cliente = new BeanPessoa(CLIENTECPF);
        }
        return cliente;
    }

    public void setCliente(BeanPessoa cliente) {
        this.CLIENTECPF = cliente.getCPF();
        this.cliente = cliente;
    }
}
